﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Collections;
using MS.Core.Base.Transaction;
using LHS.Core.TableInfo;
using System.Collections.Specialized;
using MS.Core.Constants.Objects;

namespace LHS.Win
{
    public partial class frmLapHoSoBenhAn : Form
    {// Methods
        #region Variable
        LHS.Core.Clinical.ClinicalController objController = new LHS.Core.Clinical.ClinicalController();
        private string _strDienBienBenh = string.Empty;
        #endregion

        public frmLapHoSoBenhAn()
        {
            this.InitializeComponent();
        }

        #region Button Event
        private void btAdd_Click(object sender, EventArgs e)
        {
            this.treeView1_DoubleClick(sender, e);
        }

        private void btLuuBenhAn_Click(object sender, EventArgs e)
        {
            if (this.CheckData())
            {
                if ((this.tbPhone.Text.Length > 0) && !this.IsNumber(this.tbPhone.Text.ToString()))
                {
                    MessageBox.Show("Số điện thoại không hợp lệ", "Lỗi nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                }
                else if ((this.tbDiDong.Text.Length > 0) && !this.IsNumber(this.tbDiDong.Text.ToString()))
                {
                    MessageBox.Show("Số điện thoại di động không hợp lệ", "Lỗi nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                }
                else
                {
                    string str;
                    string str2;
                    string str4;
                    if (this.tbMach.Text.Length > 0)
                    {
                        if (!this.IsNumber(this.tbMach.Text.ToString()))
                        {
                            MessageBox.Show("Mạch không hợp lệ", "Lỗi nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                            return;
                        }
                        str = this.tbMach.Text.ToString();
                    }
                    else
                    {
                        str = "0";
                    }
                    if (this.tbNhietDo.Text.Length > 0)
                    {
                        if (!this.IsFloat(this.tbNhietDo.Text.ToString()))
                        {
                            MessageBox.Show("Nhiệt độ không hợp lệ", "Lỗi nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                            return;
                        }
                        str2 = this.tbNhietDo.Text.ToString();
                    }
                    else
                    {
                        str2 = "0";
                    }
                    if (this.tbCanNang.Text.Length > 0)
                    {
                        if (!this.IsFloat(this.tbCanNang.Text.ToString()))
                        {
                            MessageBox.Show("Cân nặng không hợp lệ", "Lỗi nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                            return;
                        }
                        str4 = this.tbCanNang.Text.ToString();
                    }
                    else
                    {
                        str4 = "0";
                    }
                    string str3 = this.tbHuyetAp.Text.ToString();
                    string str5 = this.rbMale.Checked ? "Nam" : "Nữ";
                    
                    TransactionManager trans =  TransactionManager.ThreadTransactionMgr();
                    ListDictionary param = new ListDictionary();
                    try
                    {
                        trans.TransactionCommitted += new TransactionManager.TransactionCommittedDelegate(trans.txMgr_TransactionCommitted);
                        trans.BeginTransaction();
                        
                        this.clrISN = objController.GetNewCLRISN();

                        ArrayList list = new ArrayList();
                        ArrayList list2 = new ArrayList();
                        ArrayList list3 = new ArrayList();
                        int count = this.listView1.Items.Count;
                        for (int i = 0; i < count; i++)
                        {
                            string str6 = this.listView1.Items[i].Text.ToString();
                            switch (this.listView1.Items[i].ForeColor.Name.ToString())
                            {
                                case "Red":
                                    list3.Add(0);
                                    break;

                                case "Blue":
                                    list3.Add(1);
                                    break;

                                case "Purple":
                                    list3.Add(2);
                                    break;

                                case "Green":
                                    list3.Add(3);
                                    break;

                                case "Gray":
                                    list3.Add(4);
                                    break;
                            }
                            list.Add(str6);
                        }

                        ///đoạn get SCKISN của cây triệu chứng
                        for (int j = 0; j < list.Count; j++)
                        {
                            list2.Add(objController.GetSckISN(list[j].ToString()));
                        }

                        ///đoạn insert vào bảng ClinicalSicks
                        DataTable dtClinicalSicks = InfoClinicalSick.GetStructure();
                        DataRow drClinicalSicks;
                        for (int k = 0; k < list2.Count; k++)
                        {
                            drClinicalSicks = dtClinicalSicks.NewRow();
                            drClinicalSicks[InfoClinicalSick.SCKISN] = list2[k].ToString();
                            drClinicalSicks[InfoClinicalSick.CLRISN] = this.clrISN;
                            drClinicalSicks[InfoClinicalSick.SCKSICKLEVEL] = list3[k].ToString();
                            dtClinicalSicks.Rows.Add(drClinicalSicks);
                            objController.InsertRow(drClinicalSicks);
                        }

                        list.Clear();
                        list2.Clear();

                        this.LoadID();

                        #region Insert ClinicalRecord and Patients
                        //su dung store sp_Patients_ClinicalRecordNurse_Insert
                        param.Add(InfoPatients.PATID, this.tbID.Text);
                        param.Add(InfoPatients.PATNAME, this.tbFullName.Text);
                        param.Add(InfoPatients.PATBIRTHDATE, this.dtpBirthDay.Value );
                        param.Add(InfoPatients.PATAGE, this.tbTuoi.Text);
                        param.Add(InfoPatients.PATSEX, str5);
                        param.Add(InfoPatients.PATADDRESS, this.tbAddress.Text);
                        param.Add(InfoPatients.PATTEL, this.tbPhone.Text);
                        param.Add(InfoPatients.PATOCCUPATION, this.tbJob.Text);
                        param.Add(InfoClinicalRecord.EMPISN, "1"); //--> yêu cầu xem xét lại khi nâng cấp
                        param.Add(InfoClinicalRecord.CLRPULSE, str);
                        param.Add(InfoClinicalRecord.CLRTEMPERATURE, str2);
                        param.Add(InfoClinicalRecord.CLRBLOODPRESSURE, str3);
                        param.Add(InfoClinicalRecord.CLRWEIGH, str4);
                        param.Add(InfoClinicalRecord.CLRMEDICALHISTORY, tbTienCan.Text);
                        param.Add(InfoClinicalRecord.CLRTEST, string.Empty);
                        param.Add(InfoClinicalRecord.CLRSICKNOTINLIST, tbBenhNgoaiDS.Text);
                        param.Add(InfoClinicalRecord.CLREXAMINATIONTIMES, 1);
                        param.Add(InfoClinicalRecord.CLREXAMINATIONDATE, DateTime.Now);
                        param.Add(InfoClinicalRecord.CLRSKILL, string.Empty);
                        param.Add(InfoClinicalRecord.CLRMEDICALADVICE, string.Empty);
                        param.Add(InfoClinicalRecord.CLRFOLLOWUPEXAMINATIONDATE, DateTime.Now);
                        param.Add(InfoClinicalRecord.CLRPICTURE, string.Empty);
                        param.Add(InfoClinicalRecord.CLRSURGERY, string.Empty);
                        param.Add(InfoPatients.PATMOBILE, this.tbDiDong.Text);
                        param.Add(InfoClinicalRecord.CLRSICKHISTORY, string.Empty);
                        param.Add(InfoClinicalRecord.CLRREXAMINATIONTIMES, 0);
                        param.Add(InfoClinicalRecord.CLRREXAMINATIONSTATUS, 0);
                        param.Add(InfoClinicalRecord.CLRTYPE, rbTMH.Checked == true ? "1" : "2"); //edit here 20090606 ; 1=TMH;2=TM
                        param.Add(InfoClinicalRecord.CLRREXAMINATION4SURGERY, string.Empty);
                        param.Add(InfoClinicalRecord.CLRAPPOINTMENTDATE, string.Empty); //edit here 20090830

                        LoadDienBienBenh(1, 0);//edit here 20091017
                        param.Add(InfoClinicalRecord.CLRSICKCHANGE, _strDienBienBenh); //edit here 20091017
                        objController.InsertClinicalRecord(param);
                        #endregion

                        ///insert thông tin tien can
                        ///edit by thaoht 20100108
                        param = new ListDictionary();
                        param.Add(InfoPatients.PATID, this.tbID.Text);

                        object strPATISN = objController.GetScalar(InfoClinicalRecord.PATISN, param, InfoPatients.TABLENAME);
                        ucTienCan.resetExtraID1(this.clrISN);
                        ucTienCan.resetPatientID(strPATISN.ToString());
                        ucTienCan.Save();

                        trans.CommitTransaction();

                        MessageBox.Show("Bệnh án đã được lưu", "Lập bệnh án", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

                        frmHoSoBenhAn an = new frmHoSoBenhAn(this.clrISN, "1", strPATISN.ToString());
                        an.ShowInTaskbar = false;
                        an.ShowDialog(this);

                        this.btLuuBenhAn.Enabled = false;
                        base.Close();
                    }
                    catch (Exception ex)
                    {
                        if (!(trans == null))
                        {
                            trans.RollbackTransaction();
                            trans.TransactionCommitted -= new TransactionManager.TransactionCommittedDelegate(trans.txMgr_TransactionCommitted);
                        }
                        Class.ShowException(ex);
                    }
                }
            }
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            this.listView1_DoubleClick(sender, e);
        }

        private void btThoat_Click(object sender, EventArgs e)
        {
            base.Close();
        }

        #endregion

        /// <summary>
        /// form nay do bac sy or khac voi y ta login vao
        /// nhan tren menu lap benh an moi
        /// sau khi lap xong, thi chuyen qua form ho so benh an de thuc hien tiep
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmLapHoSoBenhAn_Load(object sender, EventArgs e)
        {
            this.LoadCayBenh();
            this.LoadID();
            this.loadTienIch(); //edit here 20090910

            ///load thong tin tien can
            ///20100108
            loadThongTinTienCan("-9999"); // vi day form tao moi benh an
        }

        #region Other Utility
        private void LoadDienBienBenh(int intLanKham, int intLanTaiKham)
        {
            /* -	Phần diễn biến bệnh thì chèn vào lần khám và tái khám. Sau mỗi lần tái khám thì máy tự động chèn vào: BS khám chỉ chèn nội dung vào thôi
             -	VD:
             1.	Lần khám 1:
             1.1.	Lần tái khám 0 (ngày/tháng/năm): 
             1.2.	Lần tái khám 1 (ngày/tháng/năm):
             1.3.	Lần tái khám 2 (ngày/tháng/năm):
             2.	Lần khám 2:
             2.1.	 Lần tái khám 0 (ngày/tháng/năm): 
             2.2.	Lần tái khám 1 (ngày/tháng/năm):
             2.3.	Lần tái khám 2 (ngày/tháng/năm): */

            _strDienBienBenh = intLanKham.ToString() + ". Lần khám " + intLanKham.ToString() + ": \r\n";
            _strDienBienBenh += intLanKham.ToString() + "." + (intLanTaiKham + 1).ToString() + ". \t Lần tái khám " + intLanTaiKham.ToString() + " (" + DateTime.Now.ToString("dd/MM/yyyy") + "): \r\n";
        }

        private bool CheckData()
        {
            if (this.tbFullName.Text == "")
            {
                MessageBox.Show("Vui lòng nhập họ và tên", "Lỗi Nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return false;
            }
            if ((this.tbTuoi.Text == "") || (Convert.ToInt64(this.tbTuoi.Text.ToString()) < 0L))
            {
                MessageBox.Show("Vui lòng chọn ngày sinh hợp lệ", "Lỗi Nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return false;
            }
            if (this.tbAddress.Text == "")
            {
                MessageBox.Show("Vui lòng nhập địa chỉ", "Lỗi Nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return false;
            }
            if ((this.listView1.Items.Count <= 0) && (this.tbBenhNgoaiDS.Text == ""))
            {
                MessageBox.Show("Vui lòng chọn triệu chứng", "Lỗi Nhập", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return false;
            }
            return true;
        }

        private void insertChildNode(string strName)
        {
            this.node.Nodes.Add(strName);
        }

        private void insertParentNode(string strName)
        {
            this.node = new TreeNode(strName);
        }

        private bool IsFloat(string Number)
        {
            try
            {
                float.Parse(Number);
                return true;
            }
            catch
            {
                return false;
            }
        }

        private bool IsNumber(string Number)
        {
            try
            {
                decimal.Parse(Number);
                return true;
            }
            catch
            {
                return false;
            }
        }

        private void LoadCayBenh()
        {
            ArrayList list = new ArrayList();
            ArrayList list2 = new ArrayList();
            LHS.Core.Clinical.ClinicalController objClinicalRecord = new LHS.Core.Clinical.ClinicalController();
            try
            {
                DataTable table = objClinicalRecord.GetSickTree();
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    list.Add(table.Rows[i][0].ToString());
                    list2.Add(table.Rows[i][1].ToString());
                }
                for (int j = 0; j < list.Count; j++)
                {
                    this.insertParentNode(list2[j].ToString());
                    ListDictionary orderby = new ListDictionary();
                    orderby.Add(InfoSicks.SCKNAME, "asc");

                    List<ExpressionObject> param = new List<ExpressionObject>();
                    param.Add(new ExpressionObject(InfoSicks.SKTISN, list[j].ToString()));
                    DataTable table2 = objClinicalRecord.GetData(InfoSicks.TABLENAME, param, orderby);

                    for (int k = 0; k < table2.Rows.Count; k++)
                    {
                        this.insertChildNode(table2.Rows[k][2].ToString());
                    }
                    this.treeView1.Nodes.Add(this.node);
                }
            }
            catch (Exception ex)
            {
                Class.ShowException(ex);
            }
        }

        /// <summary>
        /// lấy ra mã bệnh nhân
        /// </summary>
        /// <returns></returns>
        private void LoadID()
        {
            try
            {
                tbID.Text = objController.GetPATID();
            }
            catch (Exception ex)
            {
                Class.ShowException(ex);
            }
        }

        #endregion

        #region Event
        private void dtpBirthDay_Leave(object sender, EventArgs e)
        {
            DateTime time = DateTime.Parse(this.dtpBirthDay.Value.ToShortDateString());
            this.tbTuoi.Text = Convert.ToString((int)(Convert.ToInt32(DateTime.Now.Year) - Convert.ToInt32(time.Year)));
        }

        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            if (this.listView1.SelectedItems.Count > 0)
            {
                ListViewItem item = this.listView1.SelectedItems[0];
                this.listView1.Items.Remove(item);
            }
        }

        private void listView1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                frmBangMau mau = new frmBangMau();
                mau.ShowInTaskbar = false;
                mau.ShowDialog();
                if (this.listView1.SelectedItems.Count > 0)
                {
                    ListViewItem item = this.listView1.SelectedItems[0];
                    ListViewItem item2 = new ListViewItem(item.Text.ToString());
                    if (Class.mau == "Red")
                    {
                        item2.ForeColor = Color.Red;
                    }
                    if (Class.mau == "Green")
                    {
                        item2.ForeColor = Color.Green;
                    }
                    if (Class.mau == "Purple")
                    {
                        item2.ForeColor = Color.Purple;
                    }
                    if (Class.mau == "Blue")
                    {
                        item2.ForeColor = Color.Blue;
                    }
                    if (Class.mau == "Gray")
                    {
                        item2.ForeColor = Color.Gray;
                    }
                    this.listView1.Items.AddRange(new ListViewItem[] { item2 });
                    this.listView1.Items.Remove(item);
                }
            }
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.listView1.SelectedItems.Count > 0)
            {
                ListViewItem item = this.listView1.SelectedItems[0];
                this.toolTip1.SetToolTip(this.listView1, item.Text.ToString());
            }
        }

        private void treeView1_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                string str = this.treeView1.SelectedNode.Text.ToString();
                int count = 0;
                int num2 = 0;
                if (!this.treeView1.SelectedNode.Parent.IsSelected)
                {
                    count = this.listView1.Items.Count;
                    if (count == 0)
                    {
                        ListViewItem item = new ListViewItem(this.treeView1.SelectedNode.Text.ToString());
                        item.ForeColor = Color.Gray;
                        this.listView1.Items.AddRange(new ListViewItem[] { item });
                    }
                    else
                    {
                        for (int i = 0; i < count; i++)
                        {
                            if (str == this.listView1.Items[i].Text.ToString())
                            {
                                num2++;
                            }
                        }
                        if (num2 == 0)
                        {
                            ListViewItem item2 = new ListViewItem(this.treeView1.SelectedNode.Text.ToString());
                            item2.ForeColor = Color.Gray;
                            this.listView1.Items.AddRange(new ListViewItem[] { item2 });
                        }
                    }
                }
            }
            catch
            {
            }
        }
        #endregion

        #region Context Menu Event
        private void AddTienCan(object sender, EventArgs e)
        {
            if (this.tbTienCan.Text == "")
            {
                this.tbTienCan.Text = "- " + sender.ToString();
            }
            else
            {
                this.tbTienCan.Text = this.tbTienCan.Text + "\r\n- " + sender.ToString();
            }
            Point pos = new Point(12, 0x18);
            ctmTienCan.Show(tbTienCan, pos);
        }
        private void AddNgheNghiep(object sender, EventArgs e)
        {
            this.tbJob.Text = sender.ToString();
            Point pos = new Point(12, 0x18);
            ctmNgheNghiep.Show(this.tbJob, pos);
        }

        private void loadTienIch()
        {
            //load them tien can, nghe nghiep,
            ArrayList paramValue = new ArrayList();
            paramValue.Add((int)InfoFacility.eFacilityType._eTienCan);
            paramValue.Add((int)InfoFacility.eFacilityType._eNgheNghiep);
            List<ExpressionObject> param = new List<ExpressionObject>();
            param.Add(new ExpressionObject(InfoFacility.FACTYPE, paramValue, ExpressionObject.eSelectOperator.In));
            DataTable dtFacility = objController.GetData(InfoFacility.TABLENAME,param);
            foreach (DataRow drFacility in dtFacility.Rows)
            {
                switch (int.Parse(drFacility[InfoFacility.FACTYPE].ToString()))
                {
                    case (int)InfoFacility.eFacilityType._eNgheNghiep:
                        this.ctmNgheNghiep.Items.Add(drFacility[InfoFacility.FACNAME].ToString());
                        this.ctmNgheNghiep.Items[this.ctmNgheNghiep.Items.Count - 1].Click += new EventHandler(this.AddNgheNghiep);
                        break;
                    case (int)InfoFacility.eFacilityType._eTienCan:
                        this.ctmTienCan.Items.Add(drFacility[InfoFacility.FACNAME].ToString());
                        this.ctmTienCan.Items[this.ctmTienCan.Items.Count - 1].Click += new EventHandler(this.AddTienCan);
                        break;
                }
            }
        }

        #endregion

        #region TienCan

        private void loadThongTinTienCan(string _strClrISN)
        {
            this.ucTienCan.PatientID = "-9999"; // vi luc nay cung co ma ID cua benh nhan , nhung chua co ma ISN cua benh nhan
            string surISN = "-9999"; // 4 Tien Can //20091216
            this.ucTienCan.SurgicalID = surISN;
            this.ucTienCan.ExtraID1 = _strClrISN;
            this.ucTienCan.getData();
        }
        #endregion
    }
}